//没有用户名密码的时候这样连接
var url = "mongodb://localhost:27017/";
//有用户名密码的时候这样连接
url = "mongodb://root:root@127.0.0.1:27017/runoob?authSource=admin";
const {MongoClient} = require('mongodb');
const oneTableTest = async () => {
    //  shard1是副本集名字,  mongodb开启事务必须用副本集
    const client = await MongoClient.connect(url, {useNewUrlParser: true,replicaSet: 'shard1'});
    const db = client.db();

    await db.createCollection('order', function (err, res) {
        if (err) throw err;
        console.log("创建集合!");

    });
    // 删除表内老数据
    await db.collection('order').deleteMany({});
    // 成功完成一个事务
    // 开启事务
    let session = client.startSession();
    await session.startTransaction();
    // 插入一条新数据
    await db.collection('order').insert({
        name: 'order1',
        total: 50
    }, {session});
    await session.commitTransaction();
    session.endSession();
    let count = await db.collection('order').countDocuments();
    console.log(`oneTableTest-现在order表中有数据${count}条`);
    // 事务回滚
    // 开启事务
    session = client.startSession();
    await session.startTransaction();
    try {
        // 插入一个正确的订单
        await db.collection('order').insert({
            name: 'order2',
            total: 100
        }, {session}); // 每次操作都得带上 session
        count = await db.collection('order').countDocuments();
        console.log(`oneTableTest-现在order表中有数据${count}条`);
        // 抛出一个异常
        throw new Error('订单异常');
    } catch (e) {
        // 有异常，终止事务
        console.log('异常，回滚事务');
        // 执行完成后，发现name为order2的订单 没有插入数据库
        await session.abortTransaction();
        session.endSession();
        count = await db.collection('order').countDocuments();
        console.log(`oneTableTest-现在order表中有数据${count}条`);
    }

};
oneTableTest();

